/*
 * @Descripttion: vite.config.ts
 * @version:
 * @Author: lhl
 * @Date: 2023-12-20 16:37:37
 * @LastEditors: lhl
 * @LastEditTime: 2024-01-11 11:55:53
 */
import legacy from '@vitejs/plugin-legacy'
import vue from '@vitejs/plugin-vue'
// import { fileURLToPath, URL } from 'node:url'
import path from 'path'
// 打包分析插件
import { visualizer } from 'rollup-plugin-visualizer'
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'
// 按需加载UI组件
// ant-design-vue 默认支持基于 ES modules 的 tree shaking
import Components from 'unplugin-vue-components/vite'
import { ConfigEnv, defineConfig, loadEnv, UserConfig } from 'vite'
// 自动处理别名
import { ViteAliases } from 'vite-aliases'
// 图片资源压缩
import viteImagemin from 'vite-plugin-imagemin'
// 通过监听文件修改，自动重启 vite 服务
import ViteRestart from 'vite-plugin-restart'
// svg处理
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
// setup语法糖name增强
import vueSetupExtend from 'vite-plugin-vue-setup-extend'

// https://vitejs.dev/config/
export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => {
  // 获取当前项目路径
  const root = process.cwd()
  // 获取当前环境变量
  const env = loadEnv(mode, root)
  // 是否是生产
  const isProd = env.VITE_ENV === 'production'
  console.log(env, 'env==', command)

  return {
    base: isProd ? './' : './',
    resolve: {
      // 已有自动别名处理
      // alias: {
      //   '@': fileURLToPath(new URL('./src', import.meta.url))
      // },
      // import的时候拓展名自动识别
      extensions: [
        '.js',
        '.ts',
        '.jsx',
        '.tsx',
        '.json',
        '.vue',
        '.mjs',
        '.cjs'
      ]
    },
    plugins: [
      vue(),
      legacy({
        targets: ['defaults', 'not IE 11']
      }),
      ViteAliases(),
      visualizer(),
      ViteRestart({
        restart: ['vite.config.ts']
      }),
      createSvgIconsPlugin({
        // 指定要缓存的文件夹
        iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
        // 指定symbolId格式
        symbolId: 'icon-[dir]-[name]'
      }),
      vueSetupExtend(),
      viteImagemin({
        gifsicle: {
          // gif 图片压缩
          optimizationLevel: 3, // 选择1到3之间的优化级别
          interlaced: false // 隔行扫描gif进行渐进式渲染
          // colors: 2 // 将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2和256之间
        },
        optipng: {
          // png
          optimizationLevel: 7 // 选择0到7之间的优化级别
        },
        mozjpeg: {
          // jpeg
          quality: 20 // 压缩质量，范围从0(最差)到100(最佳)
        },
        pngquant: {
          // png
          quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字，类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量，图像将不会被保存
          speed: 4 // 压缩速度，1(强力)到11(最快)
        },
        svgo: {
          // svg 压缩
          plugins: [
            {
              name: 'removeViewBox'
            },
            {
              name: 'removeEmptyAttrs',
              active: false
            }
          ]
        }
      }),
      Components({
        resolvers: [
          AntDesignVueResolver({
            importStyle: false // css in js
          })
        ]
      })
    ],
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@import "~assets/base.scss";` // 变量文件，在其他页面中可以直接使用变量，不用每次引入
        }
      }
    },
    build: {
      // vite 4.X 版本已经不集成 terser，需要自行下载
      // minify: 'terser', // 启用 terser 压缩
      // terserOptions: {
      // 		compress: {
      // 				drop_console: true, // 删除所有 console
      // 				drop_debugger: true,// 删除 debugger
      // 		}
      // },
      sourcemap: false,
      // 消除打包大小超过500kb警告
      chunkSizeWarningLimit: 4000,
      rollupOptions: {
        // 安全问题，打包的文件名要混淆
        output: {
          chunkFileNames: 'static/js/[hash].js',
          entryFileNames: 'static/js/[hash].js',
          assetFileNames: 'static/[ext]/[hash].[ext]'
          // 最小化拆分包 - 让打开那个页面，加载那个页面的js ，让之间的关联足够小 不建议配置，未来此配置将废弃
          // manualChunks(id) {
          //   if (id.includes('node_modules')) {
          //     return id
          //       .toString()
          //       .split('node_modules/')[1]
          //       .split('/')[0]
          //       .toString()
          //   }
          // }
        }
      }
    },
    // esbuild or terser, 默认启动的是 esbuild， esbuild比terser快 20-40 倍，压缩率只差 1%-2%
    esbuild: {
      pure: isProd ? ['console.log'] : [], // 删除 console.log
      drop: isProd ? ['debugger'] : [] // 删除 debugger
    }
  }
})
